package alocador.entidades.salas;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import alocador.entidades.salas.propriedades.Inalocavel;
import alocador.entidades.salas.propriedades.Propriedade;
import alocador.entidades.salas.propriedades.SerAberta;
import alocador.exceptions.PropriedadeInvalidaException;

/**
 * Classe que guarda informacoes de um SubTipo de Classificacao
 */
public class SubTipo {

	private String id;
	private List<String> propriedades;

	/**
	 * Construtor de um SubTipo
	 * 
	 * @param id
	 *            Id do SubTipo
	 * @param propAtivadas
	 *            Propriedades que sao Ativadas neste SubTipo Seguem o padrao:<br>
	 *            "Propriedade1,Propriedade2,Propriedade3"
	 */
	public SubTipo(String id, String propAtivadas) {

		this.id = id;
		this.propriedades = separaProp(propAtivadas);

	}

	/**
	 * Metodo acessador do ID
	 * 
	 * @return id
	 */
	public String getID() {
		return id;
	}

	/**
	 * Metodo que cria as propriedades do SubTipo
	 * 
	 * @param param
	 *            Parametros para suas Propriedades<br>
	 *            Seguindo o Padrao:<br>
	 *            "Parametro:Estado,Parametro2:Estado2,Parametro3:Estado3"
	 * @return Lista Contendo as Propriedades com os seus Estados Definidos
	 * @throws PropriedadeInvalidaException
	 *             Caso os Estados passados sejam invalidos ou<br>
	 *             O SubTipo possua uma Propriedade que nao exista
	 */
	public List<Propriedade> getPropriedades(String param)
			throws PropriedadeInvalidaException {

		HashMap<String, String> parametrosProp = transforma(param);

		List<Propriedade> propriedadesConcretas = new ArrayList<Propriedade>();

		for (String p : propriedades) {

			// Quaisquer propriedades futuras
			// devem ter seus nomes linkados
			// aqui.

			if (p.equals("SerAberta"))
				propriedadesConcretas.add(new SerAberta(parametrosProp
						.get("SerAberta")));

			else if (p.equals("Inalocavel"))
				propriedadesConcretas.add(new Inalocavel());
			else
				throw new PropriedadeInvalidaException(
						"Propriedade de SubTipo nao Existente");
		}

		return propriedadesConcretas;
	}

	private List<String> separaProp(String props) {

		if (props.isEmpty())
			return new ArrayList<String>();

		return Arrays.asList(props.split(","));
	}

	private HashMap<String, String> transforma(String prop) {

		String[] propriedadesParam = prop.split(",");

		// Ex. SerAberta -> true
		// Ex. Inalocavel -> ""
		HashMap<String, String> propLinkadas = new HashMap<String, String>();

		for (String p : propriedadesParam) {

			String[] pDivid = p.split(":");

			propLinkadas.put(pDivid[0], pDivid[1]);
		}

		return propLinkadas;
	}
}
